함수
✒️ 2025-05-19 10:22 내용 수정
Do it! 점프 투 파이썬(2017년 발행) 내용을 정리
입력 받은 값에 대해 어떤 출력값을 내는 것
- Java의 메서드(메서드(Methods))와 JavaScript의 함수(함수)도 참고.
- Python에서 함수는
def예악어를 사용하여 정의한다.
def 함수명(매개변수):
# 수행할 내용
- 위의 정의식을 Java 메서드 선언과 JavaScript 함수 선언과 비교해보자.
public String test(int a) {
// 수행할 내용
}
function testFn(args) {
// 수행할 내용
}
- 예시 함수는 매개 변수를 2개(
a, b) 받아 둘의 합을 반환한다.- c에서 함수의 인수로 1과 2를 전달한다.
>>> def add(a, b):
... return a+b
...
>>> c = add(1, 2)
>>> c
3
함수의 형태
- 함수에서
return이 사용되면 해당 위치에서 함수를 빠져나온다.
- 일반적인 함수 : 매개변수와 반환값이 있는 함수다.
def 함수명(매개변수):
# 수행할 내용
return 반환값
- 매개 변수가 없고, 반환값이 있는 함수다.
def 함수명():
# 수행할 내용
return 반환값
- 매개변수가 있고, 반환값이 없는 함수다.
def 함수명(매개변수):
# 수행할 내용
- 매개변수와 반환값이 없는 함수다.
def 함수명():
# 수행할 내용
매개변수 다루기
- 매개변수를 지정하여 호출할 수 있다.
- 매개변수를 지정하여 호출하면 매개변수의 순서에 상관없이 사용할 수 있다.
>>> def mult(a, b):
... return a * b
...
>>> print(mult(a=3, b=5))
15
>>> def sub(a, b):
... return a - b
...
>>> print(sub(b=7, a=5))
-2
- 매개변수가 여러 개인데 몇 개가 될지 모를 때 매개변수 부분에
*매개변수로 이를 처리할 수 있다.*매개변수는 함수에 전달된 인수를 모두 모아 튜플로 만든다.- 튜플 자료형이므로 인수가 내부에선 변하지 않는다.
def 함수명(*매개변수):
# 수행할 내용
>>> def add(*args):
... result = 0
... for i in args:
... result += i
... return result
...
>>>
>>> add(1, 2, 3, 4, 5)
15
- 키워드 매개변수는
**kwargs로 사용 하며, 이 경우 매개변수는 딕셔너리가 되어 모든key=value형태의 입력값이 그 딕셔너리에 저장된다.**kwargs는 keyword arguments의 약자로, 관례적으로 사용한다.- 딕셔너리 자료형 참고.
def 함수명(**kwargs):
# 수행할 내용
>>> def printer(**kwargs):
... print(kwargs)
...
>>> printer(name="kim", age=30)
{'name': 'kim', 'age': 30}
- 매개변수에 초기값을 설정할 수 있다.
- 초기화할 매개변수를 설정할 때 매개변수의 위치는 항상 뒤쪽에 둬야 한다.
- 중간 혹은 앞에 배치할 경우 Python 인터프리터는 함수에 인자로 넘겨준 값들을 어떤 매개변수에 초기화할지 판단하기 어렵기 때문에 오류를 발생 시킨다.
>>> def intro(name, open=False):
... print(f"{name}")
... if open:
... print(f"{name} is open")
... else:
... print(f"{name} is closed")
... return
...
>>> intro("door")
door
door is closed
>>> intro("door", True)
door
door is open
함수 내 변수의 효력 범위
- Java와 JavaScript에서도 함수 내에 선언된 변수가 가진 효력 범위는 함수 내에서만 유효했다.
- 필드(Fields)#3. 지역 변수(local variable), JavaScript#스코프(Scope) 참고.
- 아래 예시에서
a = "pizza"로 설정하고, 함수의 매개변수도a이지만order("beer")결과와a는 다르다. - 함수의 매개변수
a의 유효 범위는 함수order()내이기 때문에 외부에서 선언한a = "pizza"에는 영향을 주지 않는다.
>>> a = "pizza"
>>> def order(a):
... a += " and chicken"
... print(a)
...
>>>
>>> order("beer")
beer and chicken
>>> print(a)
pizza
- 함수를 사용하여 함수 외부에서 선언된 변수를 수정하려면 함수의 반환값을 함수 외부 변수에 배정한다.
>>> a = "pizza"
>>> def order(a):
... a += " and chicken"
... print(a)
... return a
...
>>>
>>> a = order("cake")
cake and chicken
>>> a
'cake and chicken'
global명령어를 사용하여 함수 외부에 선언된 변수를 함수 내부에서 수정할 수 있다.- 다만 함수는 독립적으로 존재하는 것이 좋아 되도록 사용하지 않는 것이 좋다.
>>> a = "test"
>>> def change():
... global a
... a += " for global"
...
>>> change()
>>> print(a)
test for global
lambda
def예약어와 비슷하게 함수를 생성할 때 사용하는 예약어로, 함수를 한 줄로 간결하게 만들 때 사용한다.- Java와 JavaScript에서도 간단한 함수 표현식을 람다식으로 작성했다.
함수명 = lambda 매개변수1, 매개변수2, ... : 표현식
>>> add = lambda a, b: a+b
>>> print(add(1,2))
3
- 함수명을 지정하지 않고도 사용할 수 있다.
(lambda 매개변수1, 매개변수2, ... : 표현식)(인자1, 인자2, ...)
>>> (lambda a, b: a+b)(2, 3)
5